﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DevExpress.Web.ASPxTreeView;
using System.Configuration;
using BusinessLayer.Clases_Seguridad_BO;
using EntityLayer;

namespace Tambini.Web
{
    public partial class GrupoFormActualizar : System.Web.UI.Page
    {
        static List<ListarTreeList> listTree;
        string idSeguridad = ConfigurationManager.AppSettings["Seguridad"];

        clsOpcionBL opcionLogic = new clsOpcionBL();
        clsGrupoBL grupoLogic = new clsGrupoBL();

        List<t_opcion> treeItems;
        List<t_opcion> treeItemsChild;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                this.DatosRecuperados();
                this.CargarArbol(opcionLogic.ObtenerOpcionesPorGrupo2(Convert.ToInt32(txtCodigoGrupo.Text)));
            }
        }

        void DatosRecuperados()
        {
            txtCodigoGrupo.Text = Session["ID_GRUPO"].ToString();
            txtDscGrupo.Text = Session["DES_DESCRIPCION"].ToString();
            txtNombreGrupo.Text = Session["DES_NOMBRE"].ToString();
            txtUserCreacion.Text = Session["USR_CREACION"].ToString();

            if (Session["IND_ESTADO"].ToString() == "A")
            {
                cboEstado.Text = "Activo";
            }
            else if (Session["IND_ESTADO"].ToString() == "I")
            {
                cboEstado.Text = "Inactivo";
            }
            else
            {
                cboEstado.Text = "Seleccione";
            }
        }

        protected void CargarArbol(List<int> list)
        {
            try
            {
                treeItems = this.opcionLogic.Listar();
                if (treeItems.Count > 0)
                {
                    this.LlenarOpciones(null, null, this.tvOpciones, list);
                }

                this.tvOpciones.ExpandAll();
            }
            catch (Exception ex)
            {
                //throw ex;
            }
        }

        public void LlenarOpciones(int? codigoPadre, TreeNode node, TreeView tree, List<int> list)
        {
            treeItemsChild = treeItems.FindAll(delegate(t_opcion item) { return (item.ID_PADRE == codigoPadre); });

            foreach (t_opcion hijos in treeItemsChild)
            {
                TreeNode newNode = new TreeNode(hijos.DES_NOMBRE, hijos.ID_OPCION.ToString());

                if (list.Contains(hijos.ID_OPCION))
                {
                    newNode.Checked = true;
                }

                if (codigoPadre == null) tree.Nodes.Add(newNode);
                else node.ChildNodes.Add(newNode);
                this.LlenarOpciones(hijos.ID_OPCION, newNode, null, list);
            }
        }

        protected void btnGrabar_Click(object sender, EventArgs e)
        {
            try
            {
                if (txtNombreGrupo.Text == String.Empty || txtDscGrupo.Text == String.Empty || cboEstado.SelectedIndex == 0)
                {
                    lblmsj.Text = String.Empty;
                    lblmsj.Text = "Rellene los campos vacios!";
                    string script = "ShowActualizar();";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                }
                else
                {
                    this.Actualizar();
                }
            }
            catch (Exception ex)
            {
                Response.Write(ex.Message);
            }
        }

        void Actualizar()
        {
            try
            {
                t_grupo grupo = new t_grupo();
                grupo.ID_GRUPO = Convert.ToInt32(txtCodigoGrupo.Text);
                grupo.DES_NOMBRE = txtNombreGrupo.Text;
                grupo.DES_DESCRIPCION = txtDscGrupo.Text;
                grupo.IND_ESTADO = cboEstado.Text.Substring(0, 1);
                grupo.USR_ACTUALIZO = "";
                grupo.USR_CREACION = txtUserCreacion.Text;

                if (grupoLogic.Modificar(grupo))
                {
                    grupoLogic.EliminarGrupoopcion(Convert.ToInt32(txtCodigoGrupo.Text));
                    grupoLogic.GrabarAccesosGrupo(Convert.ToInt32(txtCodigoGrupo.Text), ObtenerNodoSeleccionados(this.tvOpciones));
                    string script = "ShowOK();";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                }
            }
            catch (Exception)
            {
                //throw Exception;
            }
        }

        private List<int> ObtenerNodoSeleccionados(TreeView tv)
        {
            List<int> list = new List<int>();

            foreach (TreeNode tn in tv.Nodes)
            {
                if (tn.Checked)
                {
                    list.Add(int.Parse(tn.Value));
                }

                if (tn.ChildNodes.Count > 0)
                {
                    foreach (TreeNode cTn in tn.ChildNodes)
                    {
                        list.AddRange(ObtenerNodoHijoRecursivo(cTn));
                    }
                }
            }
            return list;
        }

        public static List<int> ObtenerNodoHijoRecursivo(TreeNode tn)
        {
            List<int> list = new List<int>();
            if (tn.Checked)
            {
                list.Add(int.Parse(tn.Value));
            }
            if (tn.ChildNodes.Count > 0)
            {
                foreach (TreeNode tnC in tn.ChildNodes)
                {
                    list.AddRange(ObtenerNodoHijoRecursivo(tnC));
                }
            }
            return list;
        }

        void limpiarCampos()
        {
            txtNombreGrupo.Text = "";
            txtDscGrupo.Text = "";
        }
        protected void btnSalir_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Administracion/Grupo/GrupoForm.aspx?id=" + Request["id"].ToString());
        }

        protected void btnLimpiar_Click(object sender, EventArgs e)
        {
            limpiarCampos();
        }

        public struct ListarTreeList
        {
            public int ID_OPCION { get; set; }
            public string DES_NOMBRE { get; set; }
            public int ID_PADRE { get; set; }
        }

    }
}